﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Battleship
{
    class myCheck : readWriteFile
    {
        public bool checkPanel(string str)//Проверка на правильность количества кораблей и палубности
        {
            int count = 0, count1 = 0, count2 = 0, count3 = 0, count4 = 0;
            string boof = str;
            for (int i = 0; i < 100; i++)
            {
                if (i == 0)//левый верхний угол
                {
                    if (boof[i] == '1')
                    {
                        boof = boof.Remove(i, 1).Insert(i, "0");
                        count++;
                        int j = i+1;
                        int k = i+10;
                        if(boof[j]=='1')
                        {
                            while(boof[j]!='0')
                            {
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                count++;
                                j++;
                            }
                            j = 0;
                        }
                        if (boof[k] == '1')
                        {
                            while (boof[k] != '0')
                            {
                                boof = boof.Remove(k, 1).Insert(k, "0");
                                count++;
                                k += 10;
                            }
                            k = 0;
                        }
                        if (count > 4)
                        {
                            return false;
                        }
                    }
                }
                if (i == 9)//правый верхний угол
                {
                    if (boof[i] == '1')
                    {
                        boof = boof.Remove(i, 1).Insert(i, "0");
                        count++;
                        int j = i - 1;
                        int k = i + 10;
                        if (boof[j] == '1')
                        {
                            while (boof[j] != '0')
                            {
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                count++;
                                j--;
                            }
                            j = 0;
                        }
                        if (boof[k] == '1')
                        {
                            while (boof[k] != '0')
                            {
                                boof = boof.Remove(k, 1).Insert(k, "0");
                                count++;
                                k += 10;
                            }
                            k = 0;
                        }
                        if (count > 4)
                        {
                            return false;
                        }
                    }
                }
                if (i == 90)//левый нижний угол
                {
                    if (boof[i] == '1')
                    {
                        boof = boof.Remove(i, 1).Insert(i, "0");
                        count++;
                        int j = i + 1;
                        int k = i - 10;
                        if (boof[j] == '1')
                        {
                            while (boof[j] != '0')
                            {
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                count++;
                                j++;
                            }
                            j = 0;
                        }
                        if (boof[k] == '1')
                        {
                            while (boof[k] != '0')
                            {
                                boof = boof.Remove(k, 1).Insert(k, "0");
                                count++;
                                k -= 10;
                            }
                            k = 0;
                        }
                        if (count > 4)
                        {
                            return false;
                        }
                    }
                }
                if (i == 99)//правый нижний угол
                {
                    if (boof[i] == '1')
                    {
                        boof = boof.Remove(i, 1).Insert(i, "0");
                        count++;
                        int j = i - 1;
                        int k = i - 10;
                        if (boof[j] == '1')
                        {
                            while (boof[j] != '0')
                            {
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                count++;
                                j--;
                            }
                            j = 0;
                        }
                        if (boof[k] == '1')
                        {
                            while (boof[k] != '0')
                            {
                                boof = boof.Remove(k, 1).Insert(k, "0");
                                count++;
                                k -= 10;
                            }
                            k = 0;
                        }
                        if (count > 4)
                        {
                            return false;
                        }
                    }
                }
                else//остальное
                {
                    if (boof[i] == '1')
                    {
                        boof = boof.Remove(i, 1).Insert(i, "0");
                        count++;
                        int j = i + 1;
                        int k;
                        if (i > 89)
                        {
                            k = 0;
                        }
                        else
                        {
                            k = i + 10;
                        }
                        if (boof[j] == '1')
                        {

                            while (!(boof[j] == '0' || j==10 || j%10 == 0 || boof[j]=='\0'))
                            {
                                if (j == 99)
                                {
                                    boof = boof.Remove(j, 1).Insert(j, "0");
                                    count++;
                                    break;
                                }
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                count++;
                                j++;
                            }
                            j = 0;
                        }
                        if (boof[k] == '1')
                        {
                            while (!(k > 99 || boof[k] == '0'))
                            {
                                boof = boof.Remove(k, 1).Insert(k, "0");
                                count++;
                                k += 10;
                            }
                            k = 0;
                        }
                        if (count > 4)
                        {
                            return false;
                        }
                    }
                }
                switch (count)
                {
                    case 1:
                        count1++;
                        count = 0;
                        break;
                    case 2:
                        count2++;
                        count = 0;
                        break;
                    case 3:
                        count3++;
                        count = 0;
                        break;
                    case 4:
                        count4++;
                        count = 0;
                        break;
                }
               
            }
            if (count1 == 4 && count2 == 3 && count3 == 2 && count4 == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
                
        }

        public bool checkPosition(string str)//Проверка на правильность расстановки кораблей
        {
            string boof = str;
            int len = 0;
            int[] mas = new int[4];            
            int count = 0;//счетчик соседей
            for (int i = 0; i < 99; i++)
            {
                if (boof[i] == '1')
                {                    
                    mas[len] = i;
                    len++;
                    boof = boof.Remove(i, 1).Insert(i, "0");
                    int j = i + 1;
                    int k;
                    if (i > 89)
                    {
                        k = 0;
                    }
                    else
                    {
                        k = i + 10;
                    }
                    if (boof[j] == '1')
                    {

                        while (!(boof[j] == '0' || j == 10 || j % 10 == 0 || boof[j] == '\0'))
                        {
                            if (j == 99)
                            {
                                boof = boof.Remove(j, 1).Insert(j, "0");
                                mas[len] = j;
                                len++;
                                break;
                            }
                            boof = boof.Remove(j, 1).Insert(j, "0");
                            mas[len] = j;
                            len++;
                            j++;
                        }
                        j = 0;
                    }
                    if (boof[k] == '1')
                    {
                        while (!(k > 99 || boof[k] == '0'))
                        {
                            boof = boof.Remove(k, 1).Insert(k, "0");
                            mas[len] = k;
                            len++;
                            k += 10;
                        }
                        k = 0;
                    }
                    //проверка на окружение
                    if(len == 1)//Если однопалубный
                    {
                        if (mas[0] > 89)
                        {
                            break;
                        }
                        else if (mas[0] == 9 || mas[0] % 10 == 9)
                        {
                            break;
                        }
                        else
                        {
                            int m = mas[0];
                            if (boof[m + 11] == '1')
                            {
                                count++;
                            }
                        }
                        if (count > 0)
                        {
                            return false;
                        }
                    }
                    else if (mas[0] == mas[1] - 1)//если корабль горизонтальный
                    {
                        for (int l = 0; l < len; l++)
                        {
                            if (mas[l] > 89)
                            {
                                break;
                            }
                            else if (mas[l] == 0 || mas[l] % 10 == 0)
                            {
                                int m = mas[l];
                                if (boof[m + 10] == '1' || boof[l + 11] == '1')
                                {
                                    count++;
                                }
                            }
                            else if (mas[l] == 9 || mas[l] % 10 == 9)
                            {
                                int m = mas[l];
                                if (boof[m + 9] == '1')
                                {
                                    count++;
                                }
                            }
                            else
                            {
                                int m = mas[l];
                                if (boof[m + 9] == '1' || boof[m + 10] == '1' || boof[m + 11] == '1')
                                {
                                    count++;
                                }
                            }
                            if (count > 0)
                            {
                                return false;
                            }
                        }
                    }
                    else if (mas[0] == mas[1] - 10)//если корабль вертикальный
                    {
                        for (int l = 0; l < len; l++)
                        {
                            if (mas[l] > 89)
                            {
                                break;
                            }
                            else if (mas[l] == 0 || mas[l] % 10 == 0)
                            {
                                int m = mas[l];
                                if (str[m + 1] == '1' || str[m + 11] == '1')
                                {
                                    count++;
                                }
                            }
                            else if (mas[l] < 9)
                            {
                                int m = mas[l];
                                if (str[m + 1] == '1' || str[m + 11] == '1')
                                {
                                    count++;
                                }
                            }
                            else if (mas[l] == 9 || mas[l] % 10 == 9)
                            {
                                count = 0;
                                break;
                            }
                            else
                            {
                                int m = mas[l];
                                if (str[m - 9] == '1' || str[m + 1] == '1' || str[m + 11] == '1')
                                {
                                    count++;
                                }
                            }
                            if (count > 0)
                            {
                                return false;
                            }
                        }
                    }

                    len = 0;
                }
            }
            return true;
        }

        public int checkAfterSort(string str, int n)//Проверка на количество палуб, после поподания в карабль
        {
            int count = 1;
            //если корабль вертикольный
            if (n > 9 && (str[n - 10] == '1' || str[n - 10] == '2'))
            {
                if (n > 19 && (str[n - 20] == '1' || str[n - 20] == '2'))
                {
                    if (n > 29 && (str[n - 30] == '1' || str[n - 30] == '2'))
                    {
                        count++;
                    }
                    count++;
                }
                count++;
            }
            if (n < 90 && (str[n + 10] == '1' || str[n + 10] == '2'))
            {
                if (n < 80 && (str[n + 20] == '1' || str[n + 20] == '2'))
                {
                    if (n < 70 && (str[n + 30] == '1' || str[n + 30] == '2'))
                    {
                        count++;
                    }
                    count++;
                }
                count++;
            }
            //если корабль горизонтальный
            if (n > 9)
            {
                if (n % 10 > 0 && (str[n - 1] == '1' || str[n - 1] == '2'))
                {
                    if (n % 10 > 1 && (str[n - 2] == '1' || str[n - 2] == '2'))
                    {
                        if (n % 10 > 2 && (str[n - 3] == '1' || str[n - 3] == '2'))
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
                if (n % 10 < 9 && (str[n + 1] == '1' || str[n + 1] == '2'))
                {
                    if (n % 10 < 8 && (str[n + 2] == '1' || str[n + 2] == '2'))
                    {
                        if (n % 10 < 7 && (str[n + 3] == '1' || str[n + 3] == '2'))
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
            }
            else
            {
                if (n > 0 && (str[n - 1] == '1' || str[n - 1] == '2'))
                {
                    if (n > 1 && (str[n - 2] == '1' || str[n - 2] == '2'))
                    {
                        if (n > 2 && (str[n - 3] == '1' || str[n - 3] == '2'))
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
                if (n < 9 && (str[n + 1] == '1' || str[n + 1] == '2'))
                {
                    if (n < 8 && (str[n + 2] == '1' || str[n + 2] == '2'))
                    {
                        if (n < 7 && (str[n + 3] == '1' || str[n + 3] == '1'))
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
            }
            return count;
        }
        
        public bool checkAfterSort2(string str, int n, int p)//Проверка на то сколько палуб подбито
        {
            int count = 1;
            //если корабль вертикольный
            if (n > 9 && str[n - 10] == '2')
            {
                if (n > 19 && str[n - 20] == '2')
                {
                    if (n > 29 &&  str[n - 30] == '2')
                    {
                        count++;
                    }
                    count++;
                }
                count++;
            }
            if (n < 90 && str[n + 10] == '2')
            {
                if (n < 80 && str[n + 20] == '2')
                {
                    if (n < 70 && str[n + 30] == '2')
                    {
                        count++;
                    }
                    count++;
                }
                count++;
            }
            //если корабль горизонтальный
            if (n > 9)
            {
                if (n % 10 > 0 && str[n - 1] == '2')
                {
                    if (n % 10 > 1 && str[n - 2] == '2')
                    {
                        if (n % 10 > 2 &&  str[n - 3] == '2')
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
                if (n % 10 < 9 && str[n + 1] == '2')
                {
                    if (n % 10 < 8 && str[n + 2] == '2')
                    {
                        if (n % 10 < 7 && str[n + 3] == '2')
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
            }
            else
            {
                if (n > 0 && str[n - 1] == '2')
                {
                    if (n > 1 && str[n - 2] == '2')
                    {
                        if (n > 2 && str[n - 3] == '2')
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
                if (n < 9 && str[n + 1] == '2')
                {
                    if (n < 8 && str[n + 2] == '2')
                    {
                        if (n < 7 && str[n + 3] == '1')
                        {
                            count++;
                        }
                        count++;
                    }
                    count++;
                }
            }
            if (count == p)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool checkStep(char ch, int id)//Проверка кто ходит
        {
            if (id == 1)
            {
                if (ch == '2')
                {
                    return false;
                }
                else if (ch == '3')
                {
                    return true;
                }
            }
            else if (id == 2)
            {
                if (ch == '2')
                {
                    return true;
                }
                else if (ch == '3')
                {
                    return false;
                }
            }
            return false;
        }

        public string checkPast(string str, int n)//Прорисовка, "МИМО" после того как убил
        {
            str = searchMimo(str, n);
            //если корабль вертикольный
            if (n > 9 && str[n - 10] == '2')
            {
                str = searchMimo(str, n - 10);
                if (n > 19 && str[n - 20] == '2')
                {
                    str = searchMimo(str, n - 20);
                    if (n > 29 && str[n - 30] == '2')
                    {
                        str = searchMimo(str, n - 30);
                    }
                }
            }
            if (n < 90 && str[n + 10] == '2')
            {
                str = searchMimo(str, n + 10);
                if (n < 80 && str[n + 20] == '2')
                {
                    str = searchMimo(str, n + 20);
                    if (n < 70 && str[n + 30] == '2')
                    {
                        str = searchMimo(str, n + 30);
                    }
                }
            }
            //если корабль горизонтальный
            if (n > 9)
            {
                if (n % 10 > 0 && str[n - 1] == '2')
                {
                    str = searchMimo(str, n - 1);
                    if (n % 10 > 1 && str[n - 2] == '2')
                    {
                        str = searchMimo(str, n - 2);
                        if (n % 10 > 2 && str[n - 3] == '2')
                        {
                            str = searchMimo(str, n - 3);
                        }
                    }
                }
                if (n % 10 < 9 && str[n + 1] == '2')
                {
                    str = searchMimo(str, n + 1);
                    if (n % 10 < 8 && str[n + 2] == '2')
                    {
                        str = searchMimo(str, n + 2);
                        if (n % 10 < 7 && str[n + 3] == '2')
                        {
                            str = searchMimo(str, n + 3);
                        }
                    }
                }
            }
            else
            {
                if (n > 0 && str[n - 1] == '2')
                {
                    str = searchMimo(str, n - 1);
                    if (n > 1 && str[n - 2] == '2')
                    {
                        str = searchMimo(str, n - 2);
                        if (n > 2 && str[n - 3] == '2')
                        {
                            str = searchMimo(str, n - 3);
                        }
                    }
                }
                if (n < 9 && str[n + 1] == '2')
                {
                    str = searchMimo(str, n + 1);
                    if (n < 8 && str[n + 2] == '2')
                    {
                        str = searchMimo(str, n + 2);
                        if (n < 7 && str[n + 3] == '2')
                        {
                            str = searchMimo(str, n + 3);
                        }
                    }
                }
            }


            return str;
            
        }

        private string searchMimo(string str, int n)//Поиск Мимо
        {
            if (n == 0)
            {
                if (str[1] == '0')
                {
                    str = str.Remove(1, 1).Insert(1, "3");
                }
                if (str[10] == '0')
                {
                    str = str.Remove(10, 1).Insert(10, "3");
                }
                if (str[11] == '0')
                {
                    str = str.Remove(11, 1).Insert(11, "3");
                }

            }
            else if (n == 9)
            {
                if (str[8] == '0')
                {
                    str = str.Remove(8, 1).Insert(8, "3");
                }
                if (str[18] == '0')
                {
                    str = str.Remove(18, 1).Insert(18, "3");
                }
                if (str[19] == '0')
                {
                    str = str.Remove(19, 1).Insert(19, "3");
                }
            }
            else if (n == 90)
            {
                if (str[80] == '0')
                {
                    str = str.Remove(80, 1).Insert(80, "3");
                }
                if (str[81] == '0')
                {
                    str = str.Remove(81, 1).Insert(81, "3");
                }
                if (str[91] == '0')
                {
                    str = str.Remove(91, 1).Insert(91, "3");
                }
            }
            else if (n == 99)
            {
                if (str[89] == '0')
                {
                    str = str.Remove(89, 1).Insert(89, "3");
                }
                if (str[88] == '0')
                {
                    str = str.Remove(88, 1).Insert(88, "3");
                }
                if (str[98] == '0')
                {
                    str = str.Remove(98, 1).Insert(98, "3");
                }
            }
            else if (n > 0 && n < 9)
            {
                for (int i = n - 1; i <= n + 1; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n + 9; i <= n + 11; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
            }
            else if (n > 90 && n < 99)
            {
                for (int i = n - 11; i <= n - 9; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n - 1; i <= n + 1; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
            }
            else if (n > 0 && n < 90 && n % 10 == 0)
            {
                for (int i = n - 10; i <= n - 9; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n; i <= n + 1; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n + 10; i <= n + 11; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
            }
            else if (n > 9 && n < 99 && n % 10 == 9)
            {
                for (int i = n - 11; i <= n - 10; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n - 1; i <= n; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n + 9; i <= n + 10; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
            }
            else
            {
                for (int i = n - 11; i <= n - 9; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n - 1; i <= n + 1; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
                for (int i = n + 9; i <= n + 11; i++)
                {
                    if (str[i] == '0')
                    {
                        str = str.Remove(i, 1).Insert(i, "3");
                    }
                }
            }
            return str;
        }

    }
}
